home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 51
/
Amiga Format CD51 (2000-03-10)(Future Publishing)(GB)[!][issue 2000-04].iso
/
-in_the_mag-
/
pdselect
/
blizkick
/
modules
/
fusionreserve.asm
< prev
next >
Wrap
Assembly Source File
|
2000-02-16
|
4KB
|
169 lines
; FILE: Source:modules/FusionReserve.ASM REV: 9 --- Do same as RsrvCold
;
; FusionReserve for BlizKick
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
; This module substitutes RsrvCold tool of FUSION MAC Emulator (Copyright
; © 1997 Jim Drew & Microcode Solutions). It should also work with
; Mac1200 (Copyright © 1992-1996 Jim Drew & Utilities Unlimited
; International, Inc.).
;
; Written by Harry Sintonen.
; This source code is Public Domain.
;
;
incdir "include:"
include "exec/execbase.i"
include "blizkickmodule.i" ; Some required...
SECTION PATCH,CODE
_DUMMY_LABEL
BK_PTC
; Code is run with following incoming parameters:
;
; a0=ptr to ROM start (buffer) eg. $1DE087B8
; a1=ptr to ROM start (ROM) eg. $00F80000 (do *not* access!)
; d0=ROM lenght in bytes eg. $00080000
; a2=ptr to _FindResident routine (will search ROM buffer for resident tag):
; CALL: jsr (a2)
; IN: a0=ptr to ROM, d0=rom len, a1=ptr to resident name
; OUT: d0=ptr to resident (buf) or NULL
; a3=ptr to _InstallModule routine (can be used to plant a "module"):
; CALL: jsr (a3)
; IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
; OUT: d0=success
; a4=ptr to _Printf routine (will dump some silly things (errormsg?) to stdout ;-)
; CALL: jsr (a4)
; IN: a0=FmtString, a1=Array (may be 0), d6=dosbase
; OUT: -
; d6=dosbase, a6=execbase
;
; Code should return:
;
; d0=true if succeeded, false if failed.
; d1-d7/a0-a6 can be trashed. a7 *must* be preserved! ;-)
NEWSTART EQU $4000
moveq #0,d7
move.l a0,a5
move.l d0,d5
lsr.l #1+5,d0 ; d0=1st 1/32th of the rom (words)
move.w #$41F8,d2 ; cmp preload
move.l #$210843F8,d3 ; -""-
.find subq.l #1,d0
beq.b .done
move.l (a0),d1
addq.l #2,a0
cmp.w d1,d2
beq.b .lea_a0
cmp.l d1,d3
bne.b .find
.lea_a0 addq.l #2,a0
cmp.w #$3000,(a0) ; A1200 rom!
beq.b .is
cmp.w #$0400,(a0)
beq.b .is
cmp.w #$1000,(a0)
beq.b .is
cmp.w #$2000,(a0)
bne.b .find
.is move.w #NEWSTART,(a0)
.skip addq.l #1,d7
bra.b .find
.done move.l d7,d0
beq.b .failed
move.l a5,a0
move.l d5,d0
lea (_FusionReserveVBR,pc),a1
jsr (a3)
bra.b .exitok
.failed lea (.errmsg,pc),a0
jsr (a4)
moveq #0,d0
.exitok rts
.errmsg dc.b 'This ROM isn''t compatible with FusionReserve patch!',10,0
CNOP 0,2
_FusionReserveVBR
BK_MOD BKMF_SingleMode,_end,(RTF_COLDSTART)<<24+37<<16+NT_UNKNOWN<<8+104,_name,_idstr,_init
; Singlemode on,
; COLDSTART module, requires KS V37.x or better, module type NT_UNKNOWN, priority 104.
_init movem.l d0-a6,-(sp)
move.l (4).w,a6 ; Really need 010+ =)
btst #AFB_68010,(AttnFlags+1,a6)
beq.b .exit2
jsr (-$78,a6) ;call Disable
lea (MemList,a6),a0 ; Is chipmem start moved?
lea (.chipname,pc),a1
jsr (-$114,a6) ;call FindName
cmp.l #$200000,d0
blo.b .in_chip
move.l d0,a0 ; node in fastmem so get
move.l (20,a0),d0 ; MH_LOWER and compare that.
.in_chip cmp.l #NEWSTART,d0
blo.b .exit ; not moved, so quit!
lea (.getvbr,pc),a5
jsr (-$1E,a6) ;call Supervisor
tst.l d0
bne.b .doclear ; was .exit ! Stupid me !-(
move.l #$400,d0
moveq #1,d1 ;MEMF_PUBLIC,d1
jsr (-$2AC,a6) ;call AllocVec
move.l d0,d2
beq.b .exit
sub.l a0,a0
move.l d2,a1
move.l #$400,d0
jsr (-$276,a6) ;call CopyMemQuick
jsr (-$27C,a6) ;call CacheClearU
lea (.setvbr,pc),a5
jsr (-$1E,a6) ;call Supervisor
.doclear
; lea ($100).w,a0
; move.w #(NEWSTART-$100)/8-1,d0
;.clear clr.l (a0)+
; clr.l (a0)+
; dbf d0,.clear
clr.b ($3E85).w
clr.b ($3E48).w
move.l #'RSRV',($2118).w
jsr (-$27C,a6) ;call CacheClearU
.exit jsr (-$7E,a6) ;call Enable
.exit2 movem.l (sp)+,d0-a6
rts
.getvbr movec vbr,d0
rte
.setvbr movec d2,vbr
rte
.chipname dc.b 'chip memory',0
_name
_idstr dc.b 'FusionReserveVBR',0
CNOP 0,2
_end
SECTION VERSION,DATA
dc.b '$VER: FusionReserve_PATCH 1.2 (25.11.97)',0